/*
 * Copyright 2020-2025 the original author or authors.
 * You cannot use this file unless authorized by the author.
 */
package org.ipig.proc.base.rule;

import org.ipig.proc.core.Action;
import org.ipig.proc.core.Collector;
import org.ipig.proc.core.Filter;
import org.ipig.proc.core.Key;
import org.ipig.proc.core.Model;
import org.ipig.proc.core.Variable;

/**
 * 规则构建器
 *
 * @author <a href="mailto:comchnts@163.com">chinats</a>
 * @version $$Id: RuleBuilder.java 3 2020-01-21 09:36:33Z ts <comchnts@163.com> $$
 * @since 1.0
 */
public interface RuleBuilder {

    /**
     * 规则名称
     *
     * @param ruleName
     * @return
     */
    public RuleBuilder newInstance(String ruleName);

    /**
     * 批量选择符合条件的 ModelUnit列表
     *
     * @param dim 维度
     * @param biz 业务类型编码
     * @return
     */
    public RuleBuilder selectModel(String dim, String biz);

    /**
     * 批量选择符合条件的 ModelUnit列表
     *
     * @param dim    维度
     * @param biz    业务类型编码
     * @param expire 是否过期，过期一般用于保存动态数据
     * @return
     */
    public RuleBuilder selectModel(String dim, String biz, boolean expire);

    /**
     * 批量选择符合条件的 ModelUnit列表
     *
     * @param dim            维度
     * @param biz            业务类型编码
     * @param expireDuration - 有效期，指定该ModelUnit的失效时间
     * @return
     */
    public RuleBuilder selectModel(String dim, String biz, Long expireDuration);

    /**
     * 根据指定对象类型过滤初始对象列表。
     *
     * @param objectType 对象类型
     * @return
     */
    public RuleBuilder selectModelType(Class<? extends Model> objectType);

    /**
     * 过滤初始对象的条件，可以多次调用该方法，是且的关系。
     *
     * @param filter 对象过滤条件。
     * @return
     */
    public RuleBuilder filter(Filter filter);

    /**
     * 对于动态数据处理模式，指定 TimedItems的lazy group模式，默认不启用该模式。
     *
     * @param lazyGroup - 是否启用 lazy group。true不会对最近一个时间段的数据进行合并，从而保证大量数据跑批规则判断的准确性。
     * @return
     */
    public RuleBuilder lazyGroup(boolean lazyGroup);

    /**
     * 对于动态数据处理模式，指定时间戳序列的时间戳对象位于原始对象的哪个字段。
     *
     * @param varTime– 指定时间
     * @return
     */
    public RuleBuilder selectTime(Variable varTime);

    /**
     * 指定存储于维度数据中的计算指标或者变量名称。非必需，如果不指定，指标名称同该计算脚本名称(newInstance中指定的名称)
     *
     * @param metrics - 计算指标名称
     * @return
     */
    public RuleBuilder selectMetrics(String metrics);

    /**
     * 对于动态数据处理模式，指定操作的行为过程
     *
     * @param action - 行为过程
     * @return
     */
    public RuleBuilder action(Action action);

    /**
     * 数据采集，只对静态数据处理模式生效。
     *
     * @param collector - 采集器 Collector
     * @return
     */
    public RuleBuilder collect(Collector collector);

    /**
     * 指定原始对象的关联主键，与待存储的维度数据中的主键进行一一映射。
     *
     * @param objectKey – Key
     * @return
     */
    public RuleBuilder selectKey(Key objectKey);


    /**
     * 只对动态数据处理模式有效，指定计算指标的过期策略。
     *
     * @param expirePattern - 过期策略。如参数为y(年)、M(月)、d(天)、 h(小时)、 m(分钟)、 s(秒)，除m表示分钟，M表示月以外，其他单位大小写不敏感。
     *                      <li>加上“p”会把指定的时间区间的数据进行时间切片计算，如24ph表示以小时作为单位进行计算，计算精度的精准度在1小时以内。</>
     *                      <li>此外expirePatter还支持int或者Long类型，此模式下，可根据个数来保留最近的交易数据。</>
     * @return
     */
    public RuleBuilder expirePattern(Object expirePattern);

    /**
     * 构建规则
     *
     * @return RuleUnit
     */
    public RuleUnit build(String className);

    /**
     * 默认构建计算规则单元
     *
     * @return RuleUnit
     */
    public RuleUnit build();
}
